package beans;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.ServletContext;

import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;

import modelos.Concessionaria;
import modelos.Cores;
import modelos.EnumCores;
import modelos.Fabricantes;
import modelos.Veiculos;

import dao.DAOConcessionaria;
import dao.DAOVeiculo;

@ManagedBean(name = "beanVeiculo")
@RequestScoped
public class BeanVeiculo {
	private String cor;
	private String ano;
	private String modelo;
	private String categoria;
	private String fabricante;
	private String search;
	private String msg;
	private String valor;
	private int id;
	private int idFabricante;
	private Veiculos veiculo;
	private String imagem;
	private String versao;
	private int idVersao;
	private UploadedFile file;
	private File teste;
	private int novaVersao;
	
	public boolean verificaCampos()
	{
		boolean bRet = false;
		if(modelo.isEmpty())
		{
			
		}
		else
		{
			bRet = true;
		}
		
		
		return bRet;
	}
	
	public void novoVeiculo()
	{
		DAOVeiculo daVeiculo = null;
		veiculo = null;
		
			try
			{
				daVeiculo = new DAOVeiculo();
				
				daVeiculo.insereNovoVeiculo(idFabricante,modelo,imagem);
				daVeiculo.insereVersao(versao, id, idFabricante, Double.parseDouble(valor));
				
				msg = "Veiculo cadastrado com sucesso";
			}
			catch(Exception err)
			{
				msg = err.toString();
			}
			finally
			{
			}
			
	}
	
	public List<SelectItem> getFabricantes()
	{
		DAOVeiculo daVeiculo = null;
		List<Fabricantes> fabricantes = null;
		List<SelectItem> itens = null;
		
		try
		{
			daVeiculo = new DAOVeiculo();
			fabricantes = new ArrayList<Fabricantes>();
			itens = new ArrayList<SelectItem>();
			
			fabricantes = daVeiculo.buscaFabricante();
			
			for(Fabricantes marca : fabricantes)
			{
				SelectItem item = new SelectItem();
				item.setLabel(marca.getNome());
				item.setValue(marca.getId());
				
				itens.add(item);
			}
		}
		catch(Exception err)
		{
			err.printStackTrace();
		}
		
		return itens;
		
	}
	
	public void criaArquivo(byte[] bytes, String arquivo) {
		FileOutputStream fos;
		try {
			fos = new FileOutputStream(arquivo);
			fos.write(bytes);
			fos.close();
		} 
		catch (FileNotFoundException ex) {
			ex.printStackTrace();
		} 
		catch (IOException ex) {
			ex.printStackTrace();
		}
	}
	
	public void uploadFile(FileUploadEvent evt)
	{
		byte [] foto = evt.getFile().getContents();
		String nomeArquivo = evt.getFile().getFileName();
		FacesContext fc = FacesContext.getCurrentInstance();
		ServletContext sc = (ServletContext) fc.getExternalContext().getContext();
		String arquivo = sc.getRealPath("\\WebContent\\resources\\img\\" + nomeArquivo);
		this.criaArquivo(foto, arquivo);
		
		this.imagem = evt.getFile().getFileName();
	}
	
	public List<Veiculos> getVeiculos()
	{
		List<Veiculos> veiculos = null;
		DAOVeiculo daVeiculo = null;
		
		try
		{
			veiculos = new ArrayList<Veiculos>();
			daVeiculo = new DAOVeiculo();
			
			veiculos = daVeiculo.buscaVeiculos();
		}
		catch(Exception err)
		{
			err.printStackTrace();
		}
		
		return veiculos;
	}
	
	public List<Veiculos> getVersoes()
	{
		List<Veiculos> versoes = null;
		DAOVeiculo daVeiculo = null;
		
		try
		{
			versoes = new ArrayList<Veiculos>();
			daVeiculo = new DAOVeiculo();
			
			versoes = daVeiculo.buscaVersoes(id);
		}
		catch(Exception err)
		{
			err.printStackTrace();
		}
		
		return versoes;
	}
	
	public void editarVersao()
	{
		DAOVeiculo daVeiculo = null;
		
		try
		{
			daVeiculo = new DAOVeiculo();
			
			daVeiculo.editaVersao(versao, Double.parseDouble(valor), idVersao);
		}
		catch(Exception err)
		{
			err.printStackTrace();
		}
	}
	
	public void excluiVersao()
	{
		DAOVeiculo daVeiculo = null;
		
		try
		{
			daVeiculo = new DAOVeiculo();
			
			daVeiculo.excluiVersao(idVersao);
		}
		catch(Exception err)
		{
			err.printStackTrace();
		}
	}
	
	public void excluiVeiculo()
	{
		DAOVeiculo daVeiculo = null;
		
		try
		{
			daVeiculo = new DAOVeiculo();
			
			daVeiculo.deletaVeiculo(id);
		}
		catch(Exception err)
		{
			err.printStackTrace();
		}
	}
	
	public void editaVeiculo()
	{
		DAOVeiculo daVeiculo = null;
		

		try
		{
			daVeiculo = new DAOVeiculo();
			
			daVeiculo.editaVeiculo(id, modelo, idFabricante, imagem);
		}
		catch(Exception err)
		{
			err.printStackTrace();
		}
	}
	
	public void gravar()
	{
		if(verificaCampos())
		{
			try
			{
				if(id != 0)
				{
					if(this.novaVersao==1)
					{
						this.insereNovaVersao();
					}
					else
					{
						this.editaVeiculo();
					}
				}
				else
				{
					this.novoVeiculo();
				}
			}
			catch(Exception err)
			{
				err.printStackTrace();
			}
			finally
			{
				this.limpaCampos();
			}
		}
	}
	
	public void insereNovaVersao()
	{
		DAOVeiculo daVeiculo = null;
		
		try
		{
			daVeiculo = new DAOVeiculo();
			
			daVeiculo.insereNovaVersao(id, idFabricante, versao, Double.parseDouble(valor));
		}
		catch(Exception err)
		{
			err.printStackTrace();
		}
	}
	
	public List<String> getCores()
	{
		DAOVeiculo daVeiculo = null;
		List<String> cores = null;
		List<Cores> arrCores = null;
		
		try
		{
			daVeiculo = new DAOVeiculo();
			cores = new ArrayList<String>();
			arrCores = new ArrayList<Cores>();
			
			arrCores = daVeiculo.buscaCores();
			
			for(Cores cor : arrCores)
			{
				cores.add(cor.getNome());
			}
		}
		catch(Exception err)
		{
			err.printStackTrace();
		}
		
		return cores;
	}
	
	public void cancelar()
	{
		this.limpaCampos();
	}
	
	public void limpaCampos()
	{
		modelo = "";
		fabricante = "";
		cor = "";
		imagem = "";
	}

	public String getCor() {
		return cor;
	}

	public void setCor(String cor) {
		this.cor = cor;
	}

	public String getAno() {
		return ano;
	}

	public void setAno(String ano) {
		this.ano = ano;
	}

	public String getModelo() {
		return modelo;
	}

	public void setModelo(String modelo) {
		this.modelo = modelo;
	}

	public String getCategoria() {
		return categoria;
	}

	public void setCategoria(String categoria) {
		this.categoria = categoria;
	}

	public String getFabricante() 
	{
		return fabricante;
	}

	public void setFabricante(String fabricante) {
		this.fabricante = fabricante;
	}

	public String getSearch() {
		return search;
	}

	public void setSearch(String search) {
		this.search = search;
	}

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public int getIdFabricante() {
		return idFabricante;
	}

	public void setIdFabricante(int idFabricante) {
		this.idFabricante = idFabricante;
	}

	public Veiculos getVeiculo() {
		return veiculo;
	}

	public void setVeiculo(Veiculos veiculo) {
		this.veiculo = veiculo;
	}

	public String getImagem() 
	{
		return imagem;
	}

	public void setImagem(String imagem) {
		this.imagem = imagem;
	}

	public UploadedFile getFile() {
		return file;
	}

	public void setFile(UploadedFile file) {
		this.file = file;
	}

	public File getTeste() {
		return teste;
	}

	public void setTeste(File teste) {
		this.teste = teste;
	}

	public String getVersao() {
		return versao;
	}

	public void setVersao(String versao) {
		this.versao = versao;
	}

	public String getValor() {
		return valor;
	}

	public void setValor(String valor) {
		this.valor = valor;
	}

	public int getIdVersao() {
		return idVersao;
	}

	public void setIdVersao(int idVersao) {
		this.idVersao = idVersao;
	}

	public int getNovaVersao() {
		return novaVersao;
	}

	public void setNovaVersao(int novaVersao) {
		this.novaVersao = novaVersao;
	}

}
